package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

/**
todo 中间件
*/

func main() {
	middleware()
}

//简单的中间件
func m1(c *gin.Context) {
	fmt.Println("....m1...in  ")

	//计时
	start := time.Now()

	c.Set("name", "张三") //todo 在一个中间件传入给另外的中间件一些信息     ---------》跨中间件取值
	c.Next()            //todo  调用后续处理函数
	//c.Abort() // todo 阻止调用后续的处理函数

	cost := time.Since(start)

	fmt.Printf("cost: %v\n", cost)
	fmt.Println("....m1...out  ")
}

func m2(c *gin.Context) {
	fmt.Println("....m2...in  ")

	value, exists := c.Get("name") //todo 获取其他中间件传给其他中间件的值
	if exists {
		fmt.Println(value)
	}
	c.Next()

	fmt.Println("....m2...out  ")
}

// todo 登录校验中间件
func authMiddleware(doCheck bool) gin.HandlerFunc {

	//连接数据库
	//或者一些其他准备工作

	return func(c *gin.Context) {
		if doCheck {
			//是否登录判断
			//	if 是登录用户
			//	c.next()
			//else
			//c.abort()
		} else {
			//放行
			c.Next()
		}
	}

}

func middleware() {

	//默认中间件， 会加入 todo engine.Use(Logger(), Recovery())  这两个中间件
	r := gin.Default()
	//engine := gin.New()

	/**
	注意  todo 多个中间件会 套娃，，  即如果有两个中间件m1，m2   则先进入m1， 然后执行c.next()调用m2  中间件， 然后等m2 执行完，才会继续执行m1 的next（）函数的后续
	*/
	r.Use(m1, m2) //todo 全局注册中间件函数

	r.GET("index", m1, func(c *gin.Context) {
		//r.GET("index", m1,func(c *gin.Context) {  //todo  局部注册中间件函数

		c.JSON(http.StatusOK, gin.H{"message": "ok"})
	})

	r.Run(":8081")
}
